Skip to content

第13章 LangChain搜索功能集成实践

学习目标

  • 掌握LangChain搜索集成的核心组件和工作原理
  • 学习如何集成Google API、DuckDuckGo和SearXNG三种搜索工具到LangChain中
  • 理解如何使用DeepSeek AI模型处理和融合多源搜索结果
  • 实现自定义搜索工作流与结果优化策略

LangChain中的搜索组件概述

LangChain提供了丰富的搜索工具集成,让大语言模型能够获取互联网上的实时信息,实现知识增强。

1. 主要搜索工具介绍

我们将重点关注三种常用的搜索工具:

  1. Google Search API:提供强大的全网索引和精准的搜索结果,但需要API密钥和配额管理
  2. DuckDuckGo:注重隐私的搜索引擎,无需API密钥,适合快速集成
  3. SearXNG:开源的元搜索引擎,可自定义和自托管,能够聚合多个搜索引擎的结果

2. 搜索工具的基本配置

python
# 导入所需的库
from langchain.tools import DuckDuckGoSearchRun
from langchain.tools import GoogleSearchAPIWrapper
from langchain.utilities import SearxSearchWrapper

# 配置DuckDuckGo搜索(无需API密钥)
ddg_search = DuckDuckGoSearchRun()

# 配置Google搜索
import os
os.environ["GOOGLE_CSE_ID"] = "your-cse-id"  # 自定义搜索引擎ID
os.environ["GOOGLE_API_KEY"] = "your-api-key"  # Google API密钥
google_search = GoogleSearchAPIWrapper()

# 配置SearXNG搜索
searx_search = SearxSearchWrapper(
    searx_host="https://your-searxng-instance.com",  # SearXNG实例URL
    engines=["google", "bing", "duckduckgo"],  # 可选择的搜索引擎
    num_results=5  # 返回结果数量
)

多搜索引擎集成与性能对比

1. 各搜索引擎特点分析

让我们了解三种搜索引擎的主要特点和适用场景:

搜索引擎优势限制适用场景
Google Search覆盖面广,结果精准,支持高级过滤需要API密钥和费用,有请求限制需要高质量搜索结果的商业应用
DuckDuckGo无需API密钥,注重隐私,集成简单结果覆盖面相对较小快速原型开发,注重用户隐私的应用
SearXNG可自托管,聚合多引擎结果,高度可定制需要自行部署维护,配置较复杂需要自主控制搜索过程的高级应用

2. 搜索引擎性能测试

我们可以通过简单的代码比较三种搜索引擎的结果差异:

python
# 定义测试查询
test_query = "DeepSeek AI最新技术进展"

# 执行多引擎搜索
google_results = google_search.run(test_query)
ddg_results = ddg_search.run(test_query)
searx_results = searx_search.run(test_query)

# 打印结果比较
print("=== Google搜索结果 ===")
print(google_results[:500] + "...")  # 截取部分显示
print("\n=== DuckDuckGo搜索结果 ===")
print(ddg_results[:500] + "...")
print("\n=== SearXNG搜索结果 ===")
print(searx_results[:500] + "...")

使用DeepSeek AI模型处理搜索结果

1. DeepSeek模型初始化

python
from langchain.chat_models import ChatDeepSeek
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

# 初始化DeepSeek模型
deepseek_model = ChatDeepSeek(api_key="your-api-key")

2. 搜索结果提取与结构化

使用DeepSeek模型对搜索结果进行处理,提取关键信息:

python
# 创建结果提取提示模板
extraction_prompt = PromptTemplate(
    input_variables=["search_results", "query"],
    template="""
从以下搜索结果中提取与查询"{query}"最相关的核心信息。
去除广告、无关内容和重复信息,保留事实性和有价值的内容。

搜索结果:
{search_results}

请以JSON格式输出提取的关键信息:
```json
[
  {
    "title": "信息标题",
    "content": "核心内容摘要",
    "relevance": 1-10的相关性评分,
    "source": "信息来源"
  }
]

""" )

创建提取链

extraction_chain = LLMChain(llm=deepseek_model, prompt=extraction_prompt)

处理搜索结果

def extract_info(search_results, query): return extraction_chain.run(search_results=search_results, query=query)

示例

structured_results = extract_info(ddg_results, test_query) print(structured_results)


## 构建多源融合搜索应用

### 1. 搜索工具封装

将三个搜索引擎封装为LangChain工具:

```python
from langchain.tools import Tool

# 创建搜索工具
tools = [
    Tool(
        name="Google搜索",
        description="使用Google搜索最新信息",
        func=google_search.run
    ),
    Tool(
        name="DuckDuckGo搜索",
        description="使用DuckDuckGo搜索信息,注重隐私",
        func=ddg_search.run
    ),
    Tool(
        name="SearXNG搜索",
        description="使用SearXNG元搜索引擎获取综合结果",
        func=searx_search.run
    )
]

2. 多源搜索结果融合

创建一个能够融合多个搜索源结果的应用:

python
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

# 创建融合提示词
fusion_prompt = PromptTemplate(
    input_variables=["google_results", "ddg_results", "searx_results", "query"],
    template="""
你是一个专业的搜索结果分析专家。请基于以下多个搜索引擎的结果,为用户提供全面、客观的信息。

用户查询: {query}

Google搜索结果:
{google_results}

DuckDuckGo搜索结果:
{ddg_results}

SearXNG搜索结果:
{searx_results}

请综合以上信息,提供一个全面且准确的回答。注意:
1. 识别不同来源间的共同点和差异点
2. 优先考虑多个来源共同提到的信息
3. 标注信息的时效性和可靠性
4. 保持客观,区分事实和观点
"""
)

# 创建融合链
fusion_chain = LLMChain(llm=deepseek_model, prompt=fusion_prompt)

# 构建融合搜索函数
def fused_search(query):
    # 并行执行多个搜索
    google_results = tools[0].func(query)
    ddg_results = tools[1].func(query)
    searx_results = tools[2].func(query)
    
    # 融合结果
    return fusion_chain.run(
        google_results=google_results,
        ddg_results=ddg_results,
        searx_results=searx_results,
        query=query
    )

# 使用融合搜索
answer = fused_search("量子计算机最新进展")
print(answer)

3. 构建智能搜索代理

使用LangChain代理框架,让AI自主选择合适的搜索工具:

python
from langchain.agents import initialize_agent, AgentType

# 创建代理
agent = initialize_agent(
    tools=tools,
    llm=deepseek_model,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True
)

# 使用代理进行搜索
response = agent.run("请介绍人工智能在医疗诊断领域的最新应用")
print(response)

搜索应用优化策略

1. 查询重写与精确化

使用DeepSeek模型优化原始查询,提高搜索精度:

python
# 创建查询重写提示词
query_rewrite_prompt = PromptTemplate(
    input_variables=["original_query"],
    template="""
请将以下用户查询重写为更加精确、清晰的搜索关键词,以便获得更相关的搜索结果。
移除模糊表达,添加具体术语,分解复杂问题为关键点。

原始查询: {original_query}

重写后的搜索关键词(直接输出关键词,不要解释):
"""
)

# 创建查询重写链
query_rewrite_chain = LLMChain(llm=deepseek_model, prompt=query_rewrite_prompt)

# 使用查询重写
original_query = "我想了解那个新出的大语言模型,好像是国内的那个?"
optimized_query = query_rewrite_chain.run(original_query=original_query)
print(f"原始查询: {original_query}")
print(f"优化后查询: {optimized_query}")

# 使用优化后的查询进行搜索
optimized_results = fused_search(optimized_query)
print(optimized_results)

2. 实现自适应搜索策略

根据问题类型自动选择最合适的搜索引擎组合:

python
# 创建策略选择提示词
strategy_prompt = PromptTemplate(
    input_variables=["query"],
    template="""
分析以下查询,确定最佳的搜索策略。

查询: {query}

请以JSON格式输出搜索策略:
```json
{
  "query_type": "技术/新闻/通用/历史/学术",
  "time_sensitivity": "高/中/低",
  "recommended_engines": ["引擎1", "引擎2"],
  "priority_engine": "主要推荐引擎"
}

""" )

创建策略选择链

strategy_chain = LLMChain(llm=deepseek_model, prompt=strategy_prompt)

自适应搜索函数

def adaptive_search(query): # 分析查询类型 strategy = strategy_chain.run(query=query)

# 解析返回的JSON(实际应用中需要处理异常)
import json
strategy_dict = json.loads(strategy)

# 根据策略选择搜索引擎
results = {}
if "Google" in strategy_dict["recommended_engines"]:
    results["google"] = tools[0].func(query)
if "DuckDuckGo" in strategy_dict["recommended_engines"]:
    results["ddg"] = tools[1].func(query)
if "SearXNG" in strategy_dict["recommended_engines"]:
    results["searx"] = tools[2].func(query)

# 将结果传给融合链
# 这里需要根据实际结果调整输入参数
fusion_input = {
    "query": query,
    "google_results": results.get("google", "未使用Google搜索"),
    "ddg_results": results.get("ddg", "未使用DuckDuckGo搜索"),
    "searx_results": results.get("searx", "未使用SearXNG搜索")
}

return fusion_chain.run(**fusion_input)

使用自适应搜索

result = adaptive_search("2023年突破性AI技术有哪些?") print(result)


## 构建实用搜索应用: AI研究助手

结合前面所学,构建一个实用的AI研究助手:

```python
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain

# 创建带记忆的研究助手提示词
research_assistant_prompt = PromptTemplate(
    input_variables=["history", "input"],
    template="""
你是一位专业的AI研究助手,能够帮助用户研究任何主题。你有以下功能:
1. 分析用户的研究问题
2. 使用多个搜索引擎获取最新信息
3. 整合和综合信息,提供深入的分析
4. 跟踪研究上下文,并在多轮对话中保持连贯性

聊天历史:
{history}

用户问题: {input}

请先思考用户问题的本质和所需信息类型,再决定如何回应。如果需要搜索,请明确说明你将搜索什么内容。
"""
)

# 创建研究助手对话链
memory = ConversationBufferMemory()
research_chain = ConversationChain(
    llm=deepseek_model,
    prompt=research_assistant_prompt,
    memory=memory,
    verbose=True
)

# 创建搜索增强的研究助手函数
def research_assistant(query):
    # 分析是否需要搜索
    if "最新" in query or "进展" in query or "新闻" in query or "近期" in query:
        # 执行搜索
        search_results = fused_search(query)
        
        # 构造带有搜索结果的新查询
        enhanced_query = f"""
原始问题: {query}

我已经为你搜索了相关信息,结果如下:

{search_results}

请基于上述信息回答原始问题。
"""
        return research_chain.predict(input=enhanced_query)
    else:
        # 不需要搜索,直接使用模型知识回答
        return research_chain.predict(input=query)

# 使用研究助手
queries = [
    "DeepSeek AI最近有什么突破?",
    "这些突破对自然语言处理有什么影响?",
    "与其他大语言模型相比有什么优势?"
]

for query in queries:
    print(f"\n用户: {query}")
    response = research_assistant(query)
    print(f"AI助手: {response}")

思考题

  1. 如何评估多源搜索融合的效果?你会设计什么指标来衡量搜索结果的质量和相关性?

  2. 在什么场景下,GoogleAPI、DuckDuckGo和SearXNG各自具有明显优势?如何根据应用需求选择最合适的搜索工具?

  3. 如何处理多源搜索结果中的矛盾信息?DeepSeek模型在处理这类冲突时应采取什么策略?

  4. 试设计一个改进版的多源融合算法,能够自动评估不同搜索源的可靠性,并据此调整各源结果的权重。

  5. 如何在保持搜索结果准确性的同时,优化API调用成本和系统响应时间?

接下来,我们将学习如何将LangChain与向量数据库结合,构建更强大的知识检索系统。